package co.edu.udea.iw.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.dao.TipoDispositivoDAO;
import co.edu.udea.iw.dto.TipoDispositivo;
import co.edu.udea.iw.exception.IWDaoException;

/**
 * Clase que hereda de HibernateDaoSupport e implementa (sobrescribe) los
 * metodos del dao del tipoDispositivo
 * 
 * @author Santiago Ruiz
 * @author Bladimir Velez
 *
 */
public class TipoDispositivoDAOImpl extends HibernateDaoSupport implements
		TipoDispositivoDAO {
	/**
	 * Entrega los datos de un tipoDispositivo dado su identificador
	 * 
	 * @param tipoD
	 *            String identificador del tipoDispositivo
	 * @return instancia con los datos del tipoDispositivo obtenido, si no
	 *         existe el tipoDispositivo retorna null.
	 * @throws IWDaoException
	 */
	@Override
	public TipoDispositivo obtenerTipoDispositivo(String tipoD)
			throws IWDaoException {
		Session session = null;
		TipoDispositivo tipoDispositivo;
		try {
			session = getSession();
			tipoDispositivo = (TipoDispositivo) session.get(
					TipoDispositivo.class, tipoD);
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return tipoDispositivo;
	}

	/**
	 * Entrega la lista de todos los tipoDispositivos existentes en base de
	 * datos
	 * 
	 * @return lista tipoDispositivos
	 * @throws IWDaoException
	 */
	@Override
	public List<TipoDispositivo> obtenerTiposDispositivos()
			throws IWDaoException {
		Session session = null;
		List<TipoDispositivo> tiposDispositivos = new ArrayList<TipoDispositivo>();
		try {
			session = getSession();
			Criteria criteria = session.createCriteria(TipoDispositivo.class);
			tiposDispositivos = criteria.list();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return tiposDispositivos;
	}

	/**
	 * Agrega un tipoDispositivo
	 * 
	 * @param tipoDispositivo
	 *            tipoDispositivo a agregar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void agregarTipoDispositivo(TipoDispositivo tipoDispositivo)
			throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.save(tipoDispositivo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
	}

	/**
	 * Elimina un tipoDispositivo
	 * 
	 * @param tipoDispositivo
	 *            tipoDispositivo a eliminar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void eliminarTipoDispositivo(TipoDispositivo tipoDispositivo)
			throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.delete(tipoDispositivo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Actualiza un tipoDispositivo
	 * 
	 * @param tipoDispositivo
	 *            tipoDispositivo a actualizar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void actualizarTipoDispositivo(TipoDispositivo tipoDispositivo)
			throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.merge(tipoDispositivo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}
}
